from django.shortcuts import redirect
from django.core.cache import cache
import requests
from django.contrib.auth.models import User
from game.models.player.player import Player
from django.contrib.auth import login
from random import randint

'''
receive_code得到的是用户的code和state
'''
def receive_code(request):
    data = request.GET
    code = data.get('code')
    state = data.get('state')
    # print(code, state)

    '''
    如果state不在我们的数据库中，说明用户没有通过我们的网站进行授权
    这里是为了防止CSRF攻击
    '''
    '''
    我们在acapp/game/urls/index.py中，
    将第一条路由的名称设置为了"index"，
    所以我们这里可以直接使用"index"
    '''
    if not cache.has_key(state):
        return redirect("index")

    cache.delete(state)

    # 我们需要去apply_access_token_url中申请access_token
    apply_access_token_url = "https://www.acwing.com/third_party/api/oauth2/access_token/"
    params = {
        'appid': "3006",
        'secret': "67d2c537c77742d3a5e197c54b9523fe",
        'code': code
    }

    access_token_response = requests.get(apply_access_token_url, params=params).json()

    # print(access_token_response)

    # 通过access_token和openid，我们可以获取用户的信息
    access_token = access_token_response['access_token']
    openid = access_token_response['openid']

    # 匹配数据库中是否有该用户
    players = Player.objects.filter(openid=openid)
    # 如果该用户存在，无需再次获取信息。直接登录即可
    if players.exists():
        login(request, players[0].user)
        return redirect("index")

    # 如果该用户不存在，我们需要获取用户的信息
    # 使用access_token和openid，我们可以获取用户的信息
    get_userinfo_url = "https://www.acwing.com/third_party/api/meta/identity/getinfo/"
    params = {
        "access_token": access_token,
        "openid": openid
    }
    userinfo_response = requests.get(get_userinfo_url, params=params).json()

    username = userinfo_response['username']
    photo = userinfo_response['photo']

    # 如果该用户的用户名已经存在，我们需要为其生成一个新的用户名
    # 这里采用的是随机数的方式
    # 找到一个新用户名
    while User.objects.filter(username=username).exists():
        username += str(randint(0, 9))

    # 创建用户
    user = User.objects.create(username=username)
    player = Player.objects.create(user=user, photo=photo, openid=openid)

    # 登录
    login(request, user)

    # 重定向到首页
    return redirect("index")

